;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;	accelerometer.inc	    ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Declaratie constanten

aclinksM 	equ 	007h	;Bitadres voor links MEMORY
acrechtsM	equ		006h	;Bitadres voor rechts MEMORY

vorigeRicht	equ		005h	;Hiermee onthouden we wat de vorige richting was.
							;1 = links, 0=rechts
zenden		equ		004h	;Hiermee onthouden we of we aan het zenden zijn.

//*
// Echte versie
acLinksS	equ		p2.0	;sensor voor naar links te gaan	
acRechtsS	equ		p2.1	;sensor om naar rechts te gaan
//*/

/*
// Test versie
acLinksS	equ		p3.5	;sensor voor naar links te gaan	
acRechtsS	equ		p3.4	;sensor om naar rechts te gaan
//*/

intTijd1H	equ		04Eh	;dit dient om timer1 24bit te maken.

totTijdH	equ		04Fh	;totale tijd om heen en weer te zwaaien
totTijdM	equ		050h
totTijdL	equ		051h

msgLsa:		db lcd08,"L1",0
msgLso:		db lcd08,"L2",0
msgRsa:		db lcd08,"R1",0
msgRso:		db lcd08,"R2",0

accelerometer:
			push 	dpl
			push	dph
			push	psw
			push	acc
			jnb		acLinksS,acmLinksStart		;Als acLinksS nul is, is sensor gesloten en bewegen we naar links. 
			jnb		acRechtsS,acmRechtsStart
			jb		acLinksM,acmLinksStop		;We gingen daarnet naar links, maar nu niet meer!
			jb		acRechtsM,acmRechtsStop		;
			; Bij deze is er geen enkele van de sensoren gezet!				
			
acme:		pop		acc
			pop		psw
			pop		dph
			pop		dpl
			ret

acmLinksStart:	
			jb		aclinksM,acme	;Als aclinksM nog aan staat, doe dan niks
			; We zijn nu begonnen met naar links te gaan!
			jb		vorigeRicht,acme;We gingen al naar links
			mov		dptr,#msgLsa
			lcall	outmsgalcd
			setb	vorigeRicht
			setb	aclinksM		;onthou dat we naar juiste kant gaan

acmLS1:		//lcall	stopZenden
			// Louche gedoe zodat we starten met zenden als we terug starten, niet als we stoppen met zwaaien
			push	totTijdH
			push	totTijdM
			mov		totTijdH,#000h
			mov		totTijdM,#000h
			djnz	totTijdH,$
			djnz	totTijdM,$-1
			pop		totTijdM
			pop		totTijdH
			lcall	startZenden	;we zijn nog niet aan het zenden dus start zenden
			jmp		acme

acmLinksStop:
			mov		dptr,#msgLso
			lcall	outmsgalcd
			clr		aclinksM		;we gaan niet meer naar links, dus niet onthouden!  Misschien laten ontdenderen wel
			setb	vorigeRicht		;we gaan naar links!
			//jb		zenden,stopZenden	;we zijn aan het zenden dus stop zenden!
			jmp		acme			;we gaan hier weer weg

acmRechtsStart:	
		   	jb		acRechtsM,acme	;Als acRechtsM nog aan staat, doe dan niks 
			; We zijn nu begonnen met naar rechts te gaan!				
			jnb		vorigeRicht,acme;We gingen al naar rechts
			mov		dptr,#msgRsa
			lcall	outmsgalcd
			clr		vorigeRicht
			setb	acRechtsM		;onthou dat we naar rechts gaan
			//jmp		acmLS1
			lcall	stopZenden
			jmp		acme

acmRechtsStop:
			mov		dptr,#msgRso
			lcall	outmsgalcd
			clr		acRechtsM		;we gaan niet meer naar rechts, dus onthouden we dat.
			clr		vorigeRicht		;we gaan naar links!
			//jb		zenden,stopZenden	;we zijn aan het zenden dus stop zenden!
			jmp		acme			;we gaan hier weer weg

startZenden:
			setb	zenden			;we starten het zenden
			lcall	LEDstart		;starten met zenden!
			lcall	interruptWoordStart	;Laat ledjes branden!
			lcall	tmr1clr			;maak timer1 terug leeg
			setb	TR1				;start teller

			mov		acc,#lcd0F
			lcall	outcharlcd
			mov		acc,#"T"
			lcall	outcharlcd

			ret		;het is goed geweest, we maken dat we hier weg zijn

stopZenden:
			clr		zenden			;we stoppen met zenden
			clr		TR1				;zet timer1 af
			mov		totTijdH,intTijd1H	;onthou totale tijd nu
			mov		totTijdM,TH1
			mov		totTijdL,TL1
			
			clr		TR0		;Dit omdat we anders niet goed kunnen instellen.  Dit is nog niet goed eigenlijk
			lcall	LEDstop	;Dit zodat we ook niet meer uitzenden zogezegd.
			lcall	IWinit	;doe interruptwoordInit	
			
			mov		acc,#lcd0F
			lcall	outcharlcd
			mov		acc,#" "
			lcall	outcharlcd
			mov		acc,#lcd00
			lcall	outcharlcd

			mov		acc,totTijdH
			lcall	outbytelcd
			mov		acc,totTijdM
			lcall	outbytelcd
			mov		acc,totTijdL
			lcall	outbytelcd

			ret		;het is goed geweest


;;;;; InterruptTijdmeting
;;
;; Descr: dit zorgt ervoor dat we een 24-bit-timer hebben. 
;; 		  dit is een interruptroutine.
interruptTijdMeting:
			setb	TR1				;zet timer1 weer op zodat we verdertellen
			inc		intTijd1H		;tel er eentje bij op.
			push	acc
			mov		acc,intTijd1H
			cjne	a,#00h,retis	;als we een overflow hebben, zet dan FF in intTijd1H
			mov		intTijd1H,#0FFh	;niet goed
retis:		pop 	acc
			reti


;;;;; InterruptTijdmetinginit
;;
;; Descr: stel ITM in.
interruptTijdMetinginit:
			setb	ea 				;interrupts mogen door
			setb	et1
			anl		p2,#00000011b	;zet laatste twee al zeker op 1 zodat we dingen kunnen meten!
			;Laad het getal 0x14 58 55 in.  Dit is 1 333 333 omgezet naar hex.
			mov		totTijdH,#014h		
			mov		totTijdM,#058h
			mov		totTijdL,#055h

tmr1clr:	mov		intTijd1H,#000h	;lege 24-bit timer
			mov		TH1,#000h
			mov		TL1,#000h
			ret